import json
import numpy as np


class GreatEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (np.integer, np.intc, np.intp, np.int8,
                            np.int16, np.int32, np.int64, np.uint8,
                            np.uint16, np.uint32, np.uint64)):

            return int(obj)

        elif isinstance(obj, (np.float, np.float16, np.float32, np.float64)):
            return float(obj)

        elif isinstance(obj, (np.complex, np.complex64, np.complex128)):
            return {'real': obj.real, 'imag': obj.imag}

        elif isinstance(obj, (np.ndarray,)):
            return obj.tolist()

        elif isinstance(obj, (np.bool, np.bool_)):
            return bool(obj)

        elif isinstance(obj, (np.void)):
            return None

        return super(GreatEncoder, self).default(obj)
